home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-05-12 | 6.5 KB | 303 lines | [TEXT/CWIE] |
- // NetCache Resolver, 1995 (C) Mizutori Tetsuya
- // - NCR_File.c, October 8, 1995
- // This document is pretty printed in 10-point Geneva font.
-
- #include "NCR_File.h"
- #include "NCR_Error.h"
-
- // definition
- #define kNilFilterProc nil
-
- // prototype
- //static void ErrorMessage ( long err, StringPtr string, Boolean fatal );
-
- /***** Standard File Get & Put *****/
- Boolean GetFilename ( FSSpec *theFSSpec, short numTypes, SFTypeList typeList )
- {
- StandardFileReply reply;
- // short numTypes = -1; /* all types */
- // OSType typeList[] = {'TEXT', 'PICT', 0, 0};
- OSErr err;
-
- GestaltCheck( gestaltStandardFileAttr );
-
- StandardGetFile( kNilFilterProc, numTypes, typeList, &reply );
-
- if ( ! reply.sfGood ) return false; // return by "Cancel"
-
- *theFSSpec = reply.sfFile;
-
- return true; // return by "Open"
- }
-
-
- Boolean PutFilename ( FSSpec *theFSSpec, StringPtr prompt, Boolean *replacing )
- {
- StandardFileReply reply;
- // Str63 prompt = "¥p";
- StringPtr defaultName;
-
- GestaltCheck( gestaltStandardFileAttr );
-
- defaultName = theFSSpec->name;
-
- StandardPutFile( prompt, defaultName, &reply );
-
- if ( ! reply.sfGood ) return false; // return by "Cancel"
-
- *replacing = reply.sfReplacing;
- *theFSSpec = reply.sfFile;
-
- return true; // return by "Open"
- }
-
-
- OSErr ReadFile ( FSSpec *theFSSpec, FInfo *theFInfo, Handle h, long *size )
- {
- short fRefNum;
- long textSize;
- OSErr err;
-
- if ( h == nil ) return nilHandleErr;
-
- err = FSpGetFInfo( theFSSpec, theFInfo );
- if ( err != noErr ) return err;
-
- err = FSpOpenDF( theFSSpec, fsRdPerm, &fRefNum );
- if ( err != noErr ) return err;
-
- err = GetEOF( fRefNum, &textSize );
- if ( err != noErr ) return err;
-
- // err = SetFPos( fRefNum, fsFromLEOF, 0 );
- // if ( err != noErr ) return err;
-
- SetHandleSize( h, textSize );
- if ( (err=MemError()) != noErr )
- ErrorMessageMEM( err, true );
-
- HLock( h );
- err = FSRead( fRefNum, &textSize, (Ptr) *h );
- HUnlock( h );
-
- FSClose( fRefNum );
-
- if ( err != noErr ) return err;
-
- *size = textSize;
-
- return noErr;
- }
-
-
- OSErr WriteFile ( FSSpec *theFSSpec, FInfo *theFInfo, Handle h, long *size )
- {
- OSType fdType, fdCreator;
- short fRefNum;
- long fileID;
- long textSize;
- OSErr err;
-
- if ( h == nil ) return nilHandleErr;
-
- fdType = theFInfo->fdType;
- fdCreator = theFInfo->fdCreator;
-
- #ifdef COMMENT
- #ifdef REPLACE_HINT
- if ( ! replacing ) {
- #else REPLACE_HINT
- if ( !QueryFile ( theFSSpec, &fileID ) ) {
- #endif REPLACE_HINT
- err = FSpCreate( theFSSpec, fdCreator, fdType, smSystemScript );
- if ( err != noErr ) return err;
- }
- #endif /* COMMENT */
-
- err = FSpCreate( theFSSpec, fdCreator, fdType, smSystemScript );
- if ( err != dupFNErr && err != noErr ) return err;
-
- err = FSpOpenDF( theFSSpec, fsRdWrPerm, &fRefNum );
- if ( err != noErr ) return err;
-
- err = SetEOF( fRefNum, 0 );
- if ( err != noErr ) goto out;
-
- textSize = *size;
- HLock( (Handle) h );
- err = FSWrite( fRefNum, &textSize, (Ptr) *h );
- HUnlock( (Handle) h );
-
- out:
- FSClose( fRefNum );
-
- if ( err != noErr ) return err;
-
- *size = textSize;
-
- FlushVol( nil, theFSSpec->vRefNum );
- TouchDir( theFSSpec->vRefNum, theFSSpec->parID );
-
- return noErr;
- }
-
-
- /***** Get File Information *****/
-
- #define kItsAVolume 1
- #define kItsAFolder 2
- #define kItsAFile 3
-
- OSErr GetSpecType ( FSSpec *theFSSpec )
- {
- CInfoPBRec pb;
- OSErr err;
- short objType = 0;
-
- if ( (theFSSpec->parID) == fsRtParID )
- objType = kItsAVolume;
- else {
- pb.hFileInfo.ioNamePtr = theFSSpec->name;
- pb.hFileInfo.ioVRefNum = theFSSpec->vRefNum;
- pb.hFileInfo.ioDirID = theFSSpec->parID;
- pb.hFileInfo.ioFDirIndex = 0;
- err = PBGetCatInfoSync( &pb );
- if ( err == noErr ) {
- if ( (pb.hFileInfo.ioFlAttrib & 0x10) != 0 )
- objType = kItsAFolder;
- else
- objType = kItsAFile;
- }
- }
- return objType;
- }
-
- Boolean QueryFile ( FSSpec *theFSSpec, long *fileID )
- {
- // long fileID;
- CInfoPBRec pb;
- HFileInfo *fpb = (HFileInfo *) &pb;
- // DirInfo *dpb = (DirInfo *) &pb;
- OSErr err;
-
- fpb->ioNamePtr = theFSSpec->name;
- fpb->ioVRefNum = theFSSpec->vRefNum;
- fpb->ioDirID = theFSSpec->parID;
- fpb->ioFDirIndex = 0;
-
- err = PBGetCatInfo( &pb, false );
-
- if ( err != noErr ) return false; /* the filename does not exist */
-
- #ifdef OLDVERSION
- if ( (fpb->ioFlAttrib & 0x10) != 0 )
- return false; /* but it's a folder */
- else {
- *fileID = fpb->ioDirID; /* returns its hard file ID */
- return true; } /* it's a plain file */
- #else /* OLDVERSION */
- switch ( GetSpecType( theFSSpec ) ) {
- case kItsAFile:
- *fileID = fpb->ioDirID;
- return true;
- case kItsAVolume:
- case kItsAFolder:
- default:
- break;
- }
- #endif /* OLDVERSION */
- return false;
- }
-
- /***** Finder controls *****/
- OSErr TouchDir ( short vRefNum, long dirID )
- {
- CInfoPBRec info;
- Str255 name;
- OSErr err;
-
- info.dirInfo.ioDrDirID = dirID;
- info.dirInfo.ioVRefNum = vRefNum;
- info.dirInfo.ioNamePtr = name;
- info.dirInfo.ioFDirIndex = -1;
- err = PBGetCatInfo( &info, false );
- if ( !err ) {
- info.dirInfo.ioCompletion = 0;
- info.dirInfo.ioDrDirID = info.dirInfo.ioDrParID;
- info.dirInfo.ioFDirIndex = 0;
- GetDateTime( &info.dirInfo.ioDrMdDat );
- err = PBSetCatInfo( &info, false );
- }
- return err;
- }
-
-
- /**** Generate a filename *****/
- #define MAX_FNAME 31
-
- void GenFilename ( StringPtr newFilename, StringPtr oldFilename )
- {
- short c;
- short i,n;
-
- n = oldFilename[0];
-
- for (i=0;i<=n;++i) newFilename[i] = oldFilename[i];
-
- // foooxyz -> foooox.1
- if ( n >= MAX_FNAME-1 ) {
- newFilename[MAX_FNAME-1] = '.';
- newFilename[MAX_FNAME] = '1';
- newFilename[0] = MAX_FNAME;
- return; }
-
- // foo.1 -> foo.2
- // foo.a -> foo.b
- if ( n >= 2 && newFilename[n-1] == '.' ) {
- c = newFilename[n];
- if ( '0' <= c && c < '9' ) newFilename[n] = c+1;
- else if ( c == '9' ) newFilename[n] = 'a';
- else if ( 'a' <= c && c < 'z' ) newFilename[n] = c+1;
- else if ( c == 'z' ) newFilename[n] = 'A';
- else if ( 'A' <= c && c < 'Z' ) newFilename[n] = c+1;
- else if ( c == 'Z' ) newFilename[n] = '0';
- return;
- }
-
- // foo -> foo.1
- if ( n <= MAX_FNAME-2 ) {
- newFilename[n+1] = '.';
- newFilename[n+2] = '1';
- newFilename[0] = n+2;
- return; }
- }
-
- #ifdef COMMENT
- /***** Do Error Messages *****/
- #define kAlertID 1000
- #define kErrStringID 1000
- #define kNilFilterProc nil
- #define kMoveToFront (WindowPtr)-1L
-
- static void ErrorMessage ( long err, StringPtr string, Boolean fatal )
- {
- short item;
- Str31 errStr;
- Str255 str = "¥p";
-
- NumToString( err, errStr );
-
- ParamText( "¥pError = ", errStr, "¥p¥r", string );
-
- if ( fatal ) {
- item = StopAlert( kAlertID, kNilFilterProc );
- ExitToShell();
- } else {
- item = NoteAlert( kAlertID, kNilFilterProc );
- if ( item == cancel ) ExitToShell();
- }
- }
- #endif /*COMMENT */
-
- // end of program
-